بسم الله الرحمن الرحيم
 لوحة تحكم العضو تفضل بالتسجيل لدينا التقويم بحث عن أعضاء آخرين منتدى فيجوال بيسك أسئلة وأجوبة بحث في المنتديات الصفحة الرئيسية خروج
منتـــدى فيـجــوال بيـســك منتـــدى فيـجــوال بيـســك أقسام فيجوال بيسك العامة قسم نقاش فيجوال بيسك العام سلسلة دروس تعلــم إنشاء كائنات Activex
عدد الصفحات » (4):   1   2   3   4     الموضوع السابق   الموضوع التالي
الكاتب
الموضوع أكتب موضوع جديد    أكتب رد

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

شكرا لك أخي محمد وقريب ان شاء الله سوف أواصل في تكملة الدرس


__________________
الإيمان يمان والحكمة يمانية

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 14-07-2003 08:42 AM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

بسم الله الرحمن الرحيم
الدرس السادس :

برمجة صندوق نص مشابه لـSub7 أنضر الصورة المرفقة في الدرس الأول أو الثاني :
هذا الدرس كتعلق مع الدرس الخامس وما قبله لذا المعلومات التي قد تم شرحها لن أقوم بتكرار شرحها مره أخرى
يحتوي هذا الكائن في البرنامج المذكور على حدثين هما MouseOver و MouseOut فعند مرور الماوس على صندوق النص يصبح لونه لون الخلفية , وعند مغادرة الماوس يصبح لون الخلفية الخاصة بالصندوق أسود , وعند وضع التركيز على أحد صناديق النصوص يصبح لون الصندوق لون خلفية البرنامج وإذا مر الماوس مع بقاء التركيز في احد الصناديق لا تتأثر بقية الصناديق (وكأن الماوس لم يمر عليها ) .

سيستفيد من هذا الدرس من كان يملك البرنامج المذكور كي يتعرف على الأحداث ولخصائص .
أتمنا من كان يعرف الربط لتنزيل البرنامج فليضعه هنا .

---------------------
في البداية سوف نقوم بعمل الأتي :
أولاً وضع صندوق النص على نافذة التصميم ثم تغير الخصائص التالية له كما يلي :
BorderStyle = 0-None
Text = دعها فراغ .

قم بإغلاق نافذة التصميم ثم ضع الأداة على النموذج : ستلاحظ أنك عندما تقوم بتكبير الأداة لا يحدث لصندوق النص أي تأثير أقصد من حيث أن يكبر مع كبر الأداة أو يصغر مع صغر الأداة لذلك سنحتاج لكتابة أسطر معينه في حدث ReSize التابع لأداة التصميم وهذا الكود أعتقد أنه معروف لدى الكثيرين حيث سنضع ارتفاع الصندوق مع ارتفاع الأداة ثم العرض مع عرض الأداة ..... أي أننا سنضع الحجم تماماً كحجم الأداة كما يلي
مع مراعاة ترك مسافة بين حدود الأداة وحدود الصندوق :

code:
 Private Sub UserControl_Resize()
   With Text1
     .Width = UserControl.ScaleWidth - 60
     .Height = UserControl.ScaleHeight - 60
     .Top = UserControl.ScaleTop + 30
     .Left = UserControl.ScaleLeft + 30
   End With
End Sub 

بعد أن تضع الكود المذكور في حدث UserControl_Resize أغلق نافذة التصميم ثم توجه لنافذة الـForm لاحظ عند وضع الأداة أنه كلما كبرتها أو صغرتها فإن صندوق النص يأخذ نفس حجم الأداة .

الخطوة الثانية :
نغير خلفية نافذة التصميم إلى ألون &H00808080&
(انسخ قيمة ألون ثم ألصقها في لون الخلفية في نافذة الخصائص لنافذة التصميم UserControl )

في هذه الحالة نحن لن نسمح للمستخدم للأداة أن يغير لون الخلفية وبالتالي أنا أحبذ أن نترك للمستخدم حرية اختيار الألوان ولذلك نحتاج إن نبرمج خاصية خلفية ألون للأداة والأداة تأخذ ألون من نافذة التصميم لذلك سنكتب نفس الكود في الدرس الخامس في برمجة خاصية Back Color غير أن خلفية الأداة التي ستغير تبدوا وكأنها لون حواف الأداة لذلك سنسمي الخاصية باسم BorderColor وبعد أن يتم ذلك . فقط سنضع ألون الافتراضي للخاصية هوا &H00808080& بدل عن VbBlack لتبدو خطواتنا كما يلي :
code:
 Const Default_BColor = &H808080

Private Sub UserControl_InitProperties()
 UserControl.BackColor = Default_BColor
End Sub

Private Sub UserControl_Resize()
   With Text1
     .Width = UserControl.ScaleWidth - 60
     .Height = UserControl.ScaleHeight - 60
     .Top = UserControl.ScaleTop + 30
     .Left = UserControl.ScaleLeft + 30
   End With
End Sub

Public Property Get BorderColor() As OLE_COLOR
    BorderColor = UserControl.BackColor
End Property

Public Property Let BorderColor(ByVal vNewValue As OLE_COLOR)
   UserControl.BackColor = vNewValue
   PropertyChanged "BorderColor"
End Property

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "BorderColor", UserControl.BackColor, Default_BColor
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  UserControl.BackColor = PropBag.ReadProperty("BorderColor", Default_BColor)
End Sub
 

الآن جرب وضع الأداة ثم حاول تغير الخلفية : لحظة التشغيل ومن الخصائص :
راجع الدرس الخامس (حول برمجة الخاصية BackColor ) .

الخطوة الثانية برمجة خاصية خلفية لون النص :
كي يتم ذلك سنقوم بإضافة خاصية جديدة ولنسميها BackColor (لماذا)
عندما تضع الكائن على الفورم الأ يبدو وكأن خلفية الأداة هي عبارة عن حواف وبالتالي خلفية صندوق النص هي من ستكون خلفية للأداة , سنقوم بوضع نفس الكود السابق مع بعض التغيرات :
1 - نضع إجراءين جديدين هما Property Get BackColor و Property Let BackColor .
2- نعرف متغير يحمل قيمة افتراضية للخاصية في قسم التصريحات العامة كما يلي :
code:
 Const Default_BackColor = vbBlack 

3- سنضع الأكواد التالية لكل من الإجراءين كما يلي :
code:
 Public Property Get BackColor() As OLE_COLOR
   BackColor = Text1.BackColor
End Property

Public Property Let BackColor(ByVal vNewValue As OLE_COLOR)
   Text1.BackColor = vNewValue
   PropertyChanged "BackColor"
End Property 

4 - نضيف السطر التالي إلى الحدث UserControl_InitProperties :

code:
 Text1.BackColor = Default_BackColor 

وهذا السطر يجعل خلفية صندوق النص لحظة وضعها على النموذج بالون الافتراضي


5- نضيف السطر التالي للحدث UserControl_ReadProperties بعد السطر السابق (الخاص بخلفية الحدود) ليس بالضرورة بعدة

code:
  Text1.BackColor = PropBag.ReadProperty("BackColor", Default_BackColor) 

6- نضيف السطر التالي للحدث UserControl_WriteProperties كما يلي :
code:
    PropBag.WriteProperty "BackColor", Text1.BackColor, Default_BackColor 

والآن ضع فرد جديد من أفراد الكائن على النموذج ثم انظر هل هي شبية بصندوق النص الخاص ببرنامج Sub7 أم لا .

بعد أن تمكنا من برمجة هذه الخصائص سنحتاج إلى برمجة خاصية جديدة وهي ForeColor وهي المسئولة عن تحديد لون الخط . وستكون موروثة من صندوق النص :
لعمل هذه الخاصية نتبع نفس الخطوات للخلفية BakColor مع مراعاة ما يلي :

1- ضع الإجراءين باسم ForeColor
2- المتغير الافتراضي Defualt_ForeColor دع الون الإفتراضي له بـ vbWhite
3- اتبع نفس بقية الخطوات ولكن ستكون Text1.ForeColor لأنها هي من ستأخذ الألوان كتلك Text1.Backcolor
--------------------
وبالتوفيق للجميع :
مرفق برنامج يبين عمل هذه الخصائص :
وضعت الدرس على عجالة من أمري لذا إذا كانت أي نقطه غير واضحة يسرني توضيحها لمن أردا .

في الدرس القادم سوف نتعلم كيف نبرمج خصائص إضافية وأيضاُ أحداث للكائن

لتنزيل الملف المرفق أنقر الرابط التالي: lvb.zip بلا مسؤلية على المنتدى إن كان المرفق يحتوي على فيروسات أو وسائل تجسس
تم تحميل هذا الملف 80 مرة.


__________________
الإيمان يمان والحكمة يمانية

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 14-07-2003 02:51 PM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

لا ادري ما الذي حصل لم أجد مشاركه ولا حتى تجاوب من القراء ..... : سبب لي ذلك الكسل في متابعة الدروس :

ملاحظة مهمة :
تحتاج لمواصلة الدروس فهم الدروس السابقة جيداً , فإن كان هناك قصر في الشرح فأرجوا إبلاغي بذلك حتى أحاول تبسيط هذه الدروس

بسم الله الرحمن الرحيم
الدرس السابع :
سوف أقوم بمراجعة سريعة حول برمجة خاصية تتبع كائن كما مر معنا سابقا في الدرس الخامس :
برمجة الخاصية Txt التابعة لصندوق النص :

الخاصية txt التابعة لصندوق النص هي المسؤلة عن وضع النص المكتوب في صندوق النص .
وسوف نواصل على التمرين السابق كما يلي :
في البداية كما تعودنا : سنقوم بوضع إجراءين للخاصة هما Get و Let ونسميهما Text .
مع مراعاة أن نوع الإجراءين هوا نص أي String
في هذه المرة لن ندع قيمة افتراضية للخاصية (القيمة الافتراضية ستكون أي نص يظهر في صندوق النص ) بل سندع الصندوق فارغ عند وضعة على النموذج فورم .
نضيف السطر البر مجي الخاص بالقراءة للحدث ReadProperties كالمعتاد وندع طبعاُ قيمة ناتج القراءة لصندوق النص .
نضيف السطر البر مجي الخاص بالحفظ للحدث WriteProperties .
وبالتالي سيكون عند تجربة الخاصية قم بوضع أي نص في الخاصية بعد ذلك إظغط مفتاح الإدخال Enter وسوف تلاحظ ظهور الكلمة على صندوق النص :
وضعت نقاط تحتوي على الأسطر الجديدة الخاصة بالخاصية txt :

code:
 Const Default_BColor = &H808080
Const Default_BackColor = vbBlack
Const Default_ForeColor = vbWhite

Private Sub UserControl_InitProperties()
 UserControl.BackColor = Default_BColor
 Text1.BackColor = Default_BackColor
 Text1.ForeColor = Default_ForeColor
End Sub

Private Sub UserControl_Resize()
   With Text1
     .Width = UserControl.ScaleWidth - 30
     .Height = UserControl.ScaleHeight - 30
     .Top = UserControl.ScaleTop + 20
     .Left = UserControl.ScaleLeft + 20
   End With
End Sub

Public Property Get BorderColor() As OLE_COLOR
    BorderColor = UserControl.BackColor
End Property

Public Property Let BorderColor(ByVal vNewValue As OLE_COLOR)
   UserControl.BackColor = vNewValue
   PropertyChanged "BorderColor"
End Property

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "BorderColor", UserControl.BackColor, Default_BColor
    PropBag.WriteProperty "BackColor", Text1.BackColor, Default_BackColor
    PropBag.WriteProperty "ForeColor", Text1.ForeColor, Default_ForeColor
  '------------------------------------------------
      PropBag.WriteProperty "Text", Text1.Text
  '------------------------------------------------

End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  UserControl.BackColor = PropBag.ReadProperty("BorderColor", Default_BColor)
  Text1.BackColor = PropBag.ReadProperty("BackColor", Default_BackColor)
  Text1.ForeColor = PropBag.ReadProperty("ForeColor", Default_ForeColor)
 '------------------------------------------------
   Text1.Text = CStr(PropBag.ReadProperty("Text"))
 '------------------------------------------------
End Sub

Public Property Get BackColor() As OLE_COLOR
   BackColor = Text1.BackColor
End Property

Public Property Let BackColor(ByVal vNewValue As OLE_COLOR)
   Text1.BackColor = vNewValue
   PropertyChanged "BackColor"
End Property

Public Property Get ForeColor() As OLE_COLOR
  ForeColor = Text1.ForeColor
End Property

Public Property Let ForeColor(ByVal vNewValue As OLE_COLOR)
   Text1.ForeColor = vNewValue
   PropertyChanged "ForeColor"
End Property
'------------------------------------------------
Public Property Get Text() As String
   Text = Text1.Text
End Property

Public Property Let Text(ByVal vNewValue As String)
    Text1.Text = vNewValue
    PropertyChanged "Text"
   End Property
'------------------------------------------------ 


برمجة الإحداث :
سبق وأن تكلمت عن الأحداث وشرحت أنواعها وكيف تعمل وما عليك إلى أن تراجع الدروس السابقة كي تستوعب ما معني حدث :

قم بالنقر على كائنا الجديد مرتين لتتوجه إلى نافذة الشفرة لاحظ أن الأحداث غير موجودة بالكامل وبالتالي يجب أن نضع الأحداث وسف نضع حدث جديد هذا اليوم وهوا حدث Text1_Change ولعمل ذلك نتبع الأتي

نقوم بالتصريح عن الحدث في نافذة التصميم في القسم العام باستخدام الجملة Event وهذه الجملة توضح بأن هذا السر البر مجي هوا حدث لذلك سوف يظهر في قائمة الأحداث التابعة للكائن الجديد .

وسف نطلق حدث Text1_Change كي يظهر على الكائن كما يلي :
code:
 Public Event Change() 

يفيد Public بأن هذا الحدث عام سيتم استخدامه من قبل الكائن .

الآن توجه إلى النافذة فورم ثم انقر على الكائن الجديد نقرتين لتلاحظ أن الحدث قد تم إضافته .
ولكن هذا الحدث لن يستجيب لأي كود يتم وضعه أو عندما يتم استدعائه أي أنه في هذه الحالة لم يتم تجهيزه بعد ولكي يتم ذلك لابد أن نضع السطر التالي في الحدث Text1_Change حتى يستجيب الحدث تماماُ
code:
 Private Sub UserControl_Click()
 
 RaiseEvent Click
End Sub 


جملة RaiseEvent تستخدم لإطلاق عمل الحدث .
بمجرد كتابتها وعمل مسافة سوف تظهر قائمة بها الأحداث التي تم تعريفها في أعلى نافذة التصميم عن طريق الجملة Event .

(ويمكن تشبيه ذلك) بأننا قمنا بتوريث الحدث الجديد من الحدث Text1_Change لينطلق الحدث لحظة تغير الحدث Text1_Change ليقوم بنفس العمل الخاص بالحدث Text1_Change على صندوق النص text1

لكي نعرف حدث يجب مراعاة التالي :
1 - نكتب الحلمة Public Event ثم اسم الحدث مثلاٌ Change و MouseMove و KeyPress وغيرها :
2- إذا كان الحدث يحتوي على باراميترات معينة يجب أن يتم التصريح عنا بعد إسم الحدث أي كما هي علية في الحدث الأصلي
فمثلا : الحدث KeyPress له باراميتر واحد وهوا KeyAscii أي أن صورة الحدث هي :
(Private Sub Text1_KeyPress(KeyAscii As Integer

لذا عند التصريح عنه أو تعريفة أن يتم تعريفة كما يلي :
code:
 Public Event KeyPress(KeyAscii As Integer) 


في الحدث الأصلي له سندعه ينطلق منه بالجملة RaiseEvent كما يلي :
code:
 Private Sub Text1_KeyPress(KeyAscii As Integer)
  RaiseEvent KeyPress
End Sub 


ملاحظة في الكود السابق
قمنا بإطلاق حدث صندوق النص
جرب الآن اختبار الكائن الجديد.

في الدرس القادم سوف أشرح بالتفصيل كيفية إطلاق الأحداث للكائن (مورثة) وبعد لك سنتعلم كيف نطلق حدث جديد , والمطلوب من القراء هوا محاولة تعريف الأحداث المتبقية لصندوق النص ومراجعة الرس الخاص بالأحداث .

مرفق ملف يبين برمجة الخاصية text وكذلك الأحداث Text1_KeyPress و Text1_Change
تعمدت تقصير الدرس حتى اترك لمن يحاول فهم هذه الأدوات كيف تصنع محاولة البدء بالعمل على ضوء الدوال المذكورة .

إلى القاء في الدرس الثامن

لتنزيل الملف المرفق أنقر الرابط التالي: lvb-7.zip بلا مسؤلية على المنتدى إن كان المرفق يحتوي على فيروسات أو وسائل تجسس
تم تحميل هذا الملف 74 مرة.


__________________
الإيمان يمان والحكمة يمانية

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 16-07-2003 05:41 PM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

learner
عضو نشيط

تاريخ التسجيل » Oct 2002
البلد » بلاد الله
عدد المشاركات » 44
بمعدل » 0.13 مشاركة لكل يوم
Smile مشكور

مشكور ألف شكر أخوي
وبارك الله فيك
حقيقة مجهود جبار


__________________
Learner

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

learner غير متصل Old Post 18-07-2003 01:27 AM
إضغط هنا لمشاهدة هوية learner إضغط هنا لإرسال رسالة شخصية لــ learner إضغط هنا لإرسال بريد لــ learner إبحث عن مواضيع learner أضف learner إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

مشكور أخي learner وأتمنا أن تكون قد استفدت من هذه الدروس
الدرس الثامن :
برمجة حدث جديد :
----------------------------------------------
برمجة الحدثين MouseEnter و MouseExit
----------------------------------------------
سوف نقوم في هذا الدرس بتكوين حدثين جديدين الحدث الأول مسئول عن دخول الماوس للزر والحدث الثاني مسئول عن تنفيذ مهمة لحظة خروج الماوس من الكائن .

وهناك طريقتين يمكن بها برمجة هذان الحدثان هما :
إما بتوليد الحدثين عن طريق الحدث MouseMove .
أو عن طريق أداة Timer .

مع أني أفضل الطريقة الأولى أكثر لكني سوف أذكر الطريقتين معاُ :
الطريقة الأولى :
حدث MouseMove كما شرحته سابقاً هوا الحدث المسئول عن تنفيذ مهمة عند مرور الماوس على كائن يملك هذا الحدث .
ولهذا الحدث باراميترات :
- Button
- Shift
- x
- y
ملاحظة :
راجع درس الحدث في الدروس السابقة (يجب أن تفهم جيداُ عمل الباراميترات التي يحتويها هذا الحدث وقد سبق وأن شرحتها لذا قم بمراجعتها وفهمها جيداً .

عندما نود أن نولد الحدث الأول والذي سنخصصه لتنفيذ مهمة عند خروج الماوس من الكائن والذي يمكن تسميته MouseOut أو MouseExit ولنسميه مثلاُ MouseExit .
ملاحظة :
تسمية الحدث : يفضل أن يكون اسم دال على نوع الحدث .
خطوات توليد الحدثين :

حدث MouseMove لدية باراميتران مهما لنا في هذه الحالة وهما x , y هذان الباراميتران يرجعان قيمة عشرية تبين موقع الماوس على الكائن .
طيب كيف سنستفيد من هذان الباراميتران :
لنأخذ الباراميتر الأول :
X : هذا الباراميتر يرجع قيمة تحدد موقع الماوس بالنسبة للمستوى الأفقي للكائن , ودعنا نشرح الباراميترات على كائننا المصمم .
حيث تبدأ قيم الأرقام من الحافة اليسارية للكائن حيث تمثل هذه النقطة ( 0 , 0) وهذان الرقمان يمثلاً x , y .
ومن هذه النقطة نستطيع أن نستنتج أن الباراميتر x يكون 0 لحظة خروج الماوس من الجهة ليسرى للكائن .
وهذا استنتاج جبار لنا فقد توصلنا لشيء مهم لنا .

س : طيب بالنسبة للحافة الأخرى (اليمينية للكائن ) كم يكون عندها قيمة x لحظة خروج الماوس .
للإجابة على هذا السؤل يجب أن نعرف أننا لا نستطيع في هذه الحالة - تحديد كم قيمة(ثابتة) - للحافة اليمينية (بالنسبة للمستوى لأفقي ) للكائن لماذا بسبب أن الكائن يتم تكبيره (تغير من حجمه ) وهنا لا يهمنا من تكبر الحجم إلا العرض الذي يأخذ قيم العرض x لأن العرض يتم على مستوى أفقي والمستوى الأفقي في حدث MouseMove نستطيع أن نحدد موقع المؤشر عليه عن طريق x .

أي أن قيم x عند الحافة اليمينية تتغير نظراُ لتغير عرض الكائن لذا في هذه الحالة يمكن أن نأخذ هذه القيم التي تتغير في حال تكبير أو تصغير الكائن من الطريقة أو الو ضيفة ScaleWidth التي تحدد قيمة عرض الكائن

إذا :
مؤشر الماوس في هذه الحالة سيكون 0 في بداية الزر (من الجهة ليسرى ) وعلى طول المستوى الأفقي للكائن نهاية عرضة (الحافة اليمينية ) سنعرف كم القيمة من ScaleWidth .
وبالتالي حصرنا النقاط التي منها يكون الماوس خارج الكائن .
حيث إذا كان الماوس أقل من الصفر أو أكبر من قيمة عرض الكائن (ScaleWidth) سيكون الماوس خارج الزر .
طيب هذا بالنسبة للمستوى الأفقي x
y - (نفس الشرح المذكور عدا أن هذا الباراميتر يحدد المستوى العمودي )

يرجع قيم عشرية تبين تواجد الماوس على الكائن .
حيث يكون في الحافة أللعلوية للزر بصفر ثم يبدأ بالزيادة حتى يصل إلى الحافة السفلى للزر (على المستوى العمودي )
من الملاحظ أن القمة العلوية تكون بصفر أما السفلة فلا نعرف كم سيكون عندها الماوس لأن ارتفاع الكائن (تكبيره يتم تغيره لذا ستضل القيمة العلوية كما هي علية بينما القيمة السفلة ستتغير لذا سنحصل على هذه القيمة التي تكون عن حافة الكائن من الطريقة ScaleHeight .

إذا :
ستكون القيمة y بصفر عند حافة الكائن العلوية وعند الحافة السفلية سنعرف كم القيمة من ScaleHeight

حيث إذا كان y أقل من الصفر أو أكبر من ارتفاع الكائن (ScaleHeight) سيكون الماوس بالتأكيد خارج الكائن .

بعد أن فهمنا كيف يمكن معرفة تواجد الكائن على الزر و ما هي القيم التي يكون عندها الماوس خارج الكائن سنقوم بالخطوات البرمجة كما يلي :

في قسم التصريحات العامة أكتب الأسطر التالية حيث ستكون الصيغة التي سنوفرها للحدث كما يلي :

code:
 Private Sub UserControl_MouseExit(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
   
End Sub 

لاحظ أننا وضعنا UserControl_MouseExit و UserControl عندما نضع هذا الحدث للكائن سوف تتغير إلى اسم الزر أو الكائن الذي قمنا بتصميمه لتصبح مثلاُ Button1_MouseExit ...الخ
أيضاً وضعنا للحدث الباراميترات التالي :
---------------------
Button As Integer
Shift As Integer
X As Single
Y As Single
---------------------

وهذه الباراميترات معروفه لنا (راجع درس الأحداث ) حيث يمكنك الاستغناء عنها عدا الباراميتران x , y في الحدث الذي ستقوم فيه بفحص قيمهم كما سيمر معنا .
code:
 Private Sub UserControl_MouseEnter(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
   
End Sub 

هذا الحدث الذي عملناه سيكون خاص بتنفيذ مهمة (سينطلق) لحظة دخول الماوس إلى الكائن .
طيب الآن أنتبه معي كويس وركز :
كما تحدثت يجب أن نحصل على x , y وسوف نحصل عليهم من الحدث MouseMove حيث سيتم تمرير قيمة كل الباراميترات للحدث الجديد MouseEnter ثم سنقوم من هذا الحدث الجديد بفحص قيمة x , y ثم سنمرر بعد ذلك الباراميترات التي حصل عليها إلى الحدث MouseExit إذا كان ناتج الفحص هوا خروج الماوس .
-------------------
إبداء مشروع جديد ثم ضع خلفية نافذة التصميم بالون الأحمر . بعد ذلك ضع الإجراءين (الحدثين ) السابقين في قسم التصريحات العامة كما ذكر سابقاً بعد ذلك توجهه إلى الحدث MouseMove الخاص بنافذة التصميم وقم بتمرير كل الباراميترات التي يحتويها الحدث للحدث الجديد MouseEnter كما يلي :
code:
 Private Sub UserControl_MouseMove(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
   UserControl_ MouseEnter Button, Shift, X, Y
End Sub 

عند مرور الماوس على الكائن سوف يقوم هذا الحدث باستدعاء الحدث الجديد MouseEnter وسيمرر للحدث الجديد القيمة الحالية للباراميترات حيث سيمرر الباراميتر Button الذي يحدد حالة أزرار الماوس للباراميتر الجديد Button التابع للحدث الجديد MouseEnter , وكذلك Shift و الباراميتران x , y الذين يحددان موقع مؤشر الماوس الحالي على الكائن .
في إجراء الحدث الجديد MouseEnter ضع الكود التالي والذي استنتجناه في بداية الدرس :
code:
 Private Sub UserControl_MouseEnter(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
   If X < 0 Or X > ScaleWidth Or _
      Y < 0 Or Y > ScaleHeight Then
     'الماوس خارج الزر
      BackColor = vbRed
      UserControl_ MouseExit Button, Shift, X, Y
     Else
     'الماوس داخل الزر
      BackColor = vbBlack
     End If
End Sub 

في هذا الكود :
قمنا أولاً بفحص قيمة x , y التي تم تمريرها من الحدث MouseMove للحدث الجديد MouseEnter
حيث :
إذا كان قيمة x أقل من الصفر , وأقل من الصفر لآن أول قيمة دخل الكائن تكون بصفر لذلك سنفحص القيمة أقل من الصفر فسيكون مؤشر الماوس خارج الزر(الكائن) , أو إذا كان x أكبر من عرض الكائن فسيكون خارج الزر .
هذا بالنسبة للمستوى الأفقي للماوس , أما العمودي y :
فإذا كان أقل من الصفر وأكبر من ارتفاع الكائن فسيكون الماوس خارج الزر .

في هذه الحالة إذا تحقق الشرط فسيكون الماوس خارج كلياُ من الزر , أي أننا سنقوم بإطلاق حدث MouseExit ونمرر له الباراميترات الخاصة بالحدث MouseEnter التي حصل عليها من MouseMove كما في السطر MouseExit Button, Shift, X, Y .
ثم على سبيل التوضيح وضعت السطر BackColor = vbRed ليبين عندما يخرج الماوس سيضع خلفية الكائن أو الزر التي هي عبارة عن خلفية نافذة التصميم بالون الأحمر .

وإذا لم يتحقق الشرط : فأن جواب الشرط بالطبع سيكون مؤشر الماوس داخل الزر أو الكائن :
لذلك وضعت السطر BackColor = vbBlack ليقوم بتغير لون الخلفية من الأحمر إلى الأسود

أما الإجراء الخاص بالحدث MouseExit فلن يتم وضع أي كود بداخلة (إلا إذا كانت هناك أي عملية متعلقة بالتصميم يريدها المصمم فله الحرية) .
-----------------------------------------------------
عملناُ الآن حوالي 80% من العمل بقي لنا أهم خطوة وهي :
سوف تلاحظ عند تجريب الكائن أنه عند المرور البطيء جدا من حافة الزر سوف ينفذ الحدث MouseExit أما إذا مررت الماوس بسرعة فلن يم تنفيذ الحدث MouseExit وأحيانا لايتم تنفيذه نضرا لسرعة مرور الماوس وبتالي لن يكون قادر البرنامج على فحص قيم x , y بسبب تغيير القيم بشكل سريع جداُ لا يلحظها المستخدم لذلك سنقوم بعمل بسط وهوا بتعليق مؤشر الماوس لحظة دخول الماوس ثم ترك التعليق عند الخروج وهذه العملية سوف تضبط عملنا 100% :
------------------
مشوار دوال Api
------------------
سنستخدم لهذه العملية دالتين من دوال Api لتقوم بالعملية :
الدالة الأولي : SetCapture :
تستخدم هذه الدالة لأسر مؤشر الفأرة ضمن نافذة معينة .
وتأخذ هذه الدالة باراميتر واحد وهوا hWnd والذي يحدد مقبض النافذة التي سيتم أسر الماوس عندها .
ترجع قيمة مقبض النافذة في حال النجاح وقيمة فارغة في حال الفشل .
الدالة الثانية ReleaseCapture : :
تحرر أسر الماوس وتعيد عملية معالجة إدخال الماوس بالشكل الطبيعي .
القيمة المعادة : صفرية في حال الفشل وغير صفرية في حال النجاح .

code:
Private Declare Function ReleaseCapture Lib _
"user32" () As Long
Private Declare Function SetCapture Lib _
"user32" (ByVal hwnd As Long) As Long

سوف نستخدم الدالة SetCapture لأسر الماوس في حالكان الماوس دخل الزر والدالة ReleaseCapture في حال الخروج كما يلي :
code:
 Private Sub UserControl_MouseEnter(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
   If X < 0 Or X > ScaleWidth Or _
      Y < 0 Or Y > ScaleHeight Then
     'الماوس خارج الزر
      ReleaseCapture
      BackColor = vbRed
      UserControl_MouseExit Button, Shift, X, Y
     Else
     'الماوس داخل الزر
      SetCapture hwnd
      BackColor = vbBlack
     End If
End Sub 


قم بتجريب العمل الآن لتلاحظ النتيجة :
بقي لنا في النهاية أن نعطي هذان الحدثان للكائن وإظهار هما في قائمة الأحداث للزر كي ستفيد منهم المستخدم لأداة .
سنقوم بتعريف الحدث في قسم التصريحات العامة كما يلي :
code:
 Public Event MouseEnter(Button As Integer, _
              Shift As Integer, X As Single, _
              Y As Single)
Public Event MouseExit(Button As Integer, _
             Shift As Integer, X As Single, _
             Y As Single) 

بعد أن عرفنا الحدثين مع الباراميترات على أنهما أحداث سنتوجه للحدث MouseExit ونضع به السطر التالي
code:
 Private Sub UserControl_MouseExit(Button As Integer, _
             Shift As Integer, X As Single, _
             Y As Single)
             
  RaiseEvent MouseExit (Button, Shift, X, Y)
End Sub 

وهذا الأمر سوف يطلق الحدث ويمرر القيم الجديدة للحدث العام والذي سيستخدمه مستخدم الأداة
ثم السطر RaiseEvent MouseEnter بعد جملة Else للحدث MouseEnter ليكون عملنا كاملاُ على النحو التالي :
code:
 Option Explicit
'------------------------------------------------
Private Declare Function ReleaseCapture Lib _
                        "user32" () As Long
Private Declare Function SetCapture Lib _
        "user32" (ByVal hwnd As Long) As Long
'------------------------------------------------
Public Event MouseEnter(Button As Integer, _
              Shift As Integer, X As Single, _
              Y As Single)
Public Event MouseExit(Button As Integer, _
             Shift As Integer, X As Single, _
             Y As Single)
'------------------------------------------------

Private Sub UserControl_MouseMove(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
   UserControl_MouseEnter Button, Shift, X, Y
End Sub

Private Sub UserControl_MouseEnter(Button As Integer, _
            Shift As Integer, X As Single, Y As Single)
   If X < 0 Or X > ScaleWidth Or _
      Y < 0 Or Y > ScaleHeight Then
     'الماوس خارج الزر
      ReleaseCapture
      BackColor = vbRed
      UserControl_MouseExit Button, Shift, X, Y
     Else
     'الماوس داخل الزر
      SetCapture hwnd
      BackColor = vbBlack
      RaiseEvent MouseEnter (Button, Shift, X, Y)
     End If
End Sub

Private Sub UserControl_MouseExit(Button As Integer, _
             Shift As Integer, X As Single, _
             Y As Single)
             
  RaiseEvent MouseExit (Button, Shift, X, Y)
End Sub 

وبهذا نكون قد أتمينا هذا الدرس , أرفقت ملف بهذا الدرس وكذلك صورة توضيحية لقيم موقع مؤشر الماوس على الزر .

إلى اللقاء في الدرس القادم بإذن الله وسوف نتكلم عن توليد الحدث باستخدام أداة Timer .

تم تحريره من قبل fawaz2000 في 21-07-2003 عند06:59 PM

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 21-07-2003 06:46 PM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

اه نسيت الملف

لتنزيل الملف المرفق أنقر الرابط التالي: vb.zip بلا مسؤلية على المنتدى إن كان المرفق يحتوي على فيروسات أو وسائل تجسس
تم تحميل هذا الملف 72 مرة.


__________________
الإيمان يمان والحكمة يمانية

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 21-07-2003 07:11 PM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

د.بيسيك
مبرمج نشيط

تاريخ التسجيل » Jul 2003
البلد » الجزيرة العربية
عدد المشاركات » 56
بمعدل » 0.98 مشاركة لكل يوم

كلامك صحيح أخوي تعتبر الــocx من أهم الأدوات التي يستخدمها المبرمج..وتفيده أيضاً من الناحية المادية إذ يستيطع بيعها..وهذا الذي نشاهده في أغلب المواقع البرمجية الانجليزية.


__________________
مع تحياتي،،،

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

د.بيسيك غير متصل Old Post 26-07-2003 03:45 PM
إضغط هنا لمشاهدة هوية د.بيسيك إضغط هنا لإرسال رسالة شخصية لــ د.بيسيك إبحث عن مواضيع د.بيسيك أضف د.بيسيك إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

د.بيسيك
مبرمج نشيط

تاريخ التسجيل » Jul 2003
البلد » الجزيرة العربية
عدد المشاركات » 56
بمعدل » 0.98 مشاركة لكل يوم
Thumbs up

وشاكرين لكم و إلى الأمام...


__________________
مع تحياتي،،،

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

د.بيسيك غير متصل Old Post 26-07-2003 03:49 PM
إضغط هنا لمشاهدة هوية د.بيسيك إضغط هنا لإرسال رسالة شخصية لــ د.بيسيك إبحث عن مواضيع د.بيسيك أضف د.بيسيك إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

نجـم
عضو جديد

تاريخ التسجيل » May 2003
البلد »
عدد المشاركات » 25
بمعدل » 0.19 مشاركة لكل يوم
Thumbs up

يعطيك الف عافيه حبيبي والله شرح روووووعه وأفدتنا كثييير بالشرح هذا


الف شكر لك اخوي فواز



تحياتي: نجـم

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

نجـم غير متصل Old Post 29-07-2003 11:35 AM
إضغط هنا لمشاهدة هوية نجـم إضغط هنا لإرسال رسالة شخصية لــ نجـم إبحث عن مواضيع نجـم أضف نجـم إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

ismeal2001
عضو

تاريخ التسجيل » Nov 2001
البلد » غزه
عدد المشاركات » 34
بمعدل » 0.05 مشاركة لكل يوم

بالتوفيق إن شاء الله


__________________
لتواصل عبر الماسنجر
Mr_programer112@hotmail.com

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

ismeal2001 غير متصل Old Post 31-07-2003 08:53 PM
إضغط هنا لمشاهدة هوية ismeal2001 إضغط هنا لإرسال رسالة شخصية لــ ismeal2001 إضغط هنا لإرسال بريد لــ ismeal2001 إبحث عن مواضيع ismeal2001 أضف ismeal2001 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

كنكورد
عضو جديد

تاريخ التسجيل » Jul 2003
البلد » السعودية
عدد المشاركات » 10
بمعدل » 0.21 مشاركة لكل يوم
مشكور اخوي فواز الف شكر

يعطيك الف عافيه الف شكر لك اخوي فواز

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

كنكورد غير متصل Old Post 02-08-2003 04:24 AM
إضغط هنا لمشاهدة هوية كنكورد إضغط هنا لإرسال رسالة شخصية لــ كنكورد إضغط هنا لإرسال بريد لــ كنكورد إبحث عن مواضيع كنكورد أضف كنكورد إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

إخواني الكرام أتمنا لكم جميعاُ التوفيق , وفعلاُ أخي د.بيسيك أن هذه التقنية تعتبر مهمة جداُ فهي تعطي مضاهر حسب رغبة المبرمج ولاتمنعة من التقيد بكائنات فيجول بيسك .

شكرا لك أخي نجم وكذلك الأخ كنكورد و الاخ ismeal2001
وقريب إن شاء الله سوف أواصل بقية الدروس . حيث كان سبب توقفي هذا الأسبوع هوا سفرية مفاجئة والقد عدت والله الحمد وسوف أواصل الدروس عما قريب .



__________________
الإيمان يمان والحكمة يمانية

تم تحريره من قبل fawaz2000 في 02-08-2003 عند07:02 AM

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 02-08-2003 06:55 AM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس
جميع الأوقات بتوقيت » المملكة العربية السعودية | الوقت الآن » 10:05 PM أكتب موضوع جديد    أكتب رد
 عدد الصفحات » (4):   1   2   3   4   الموضوع السابق   الموضوع التالي
[ عرض نسخة للطبع | إرسال الموضوع لصديق | إستقبل جديد هذا الموضوع ]

الإنتقال إلى:
تقييم هذا الموضوع:

قوانين المنتدى:
notتستطيع كتابة موضوع جديد                           
notتستطيع كتابة رد جديد
not تستطيع إرسال مرفقات جديدة
not تستطيع تعديل مشاركتك
شفرات HTML » غير متاح
شفرات vB » متاح
الإبتسامات » متاح
شفرة [IMG] » متاح
 

< إتصـــل بـنـــا - فيجوال بيسك للعرب > 
Copyright ©2000, 2001, Jelsoft Enterprises Limited.